package cn.gjxblog.proxy.spring.abstractAutoProxyCreator;

import cn.gjxblog.proxy.base.cglib.MyMethodInterceptor;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.support.NameMatchMethodPointcutAdvisor;
import org.springframework.context.annotation.Bean;

/**
 * TODO...
 *
 * @Author guojiaxun
 * @Date 2019/12/30 14:10
 */
public class Demo {

	/**
	 *
	 * BeanNameAutoProxyCreator
	 */
//	@Bean
	public BeanNameAutoProxyCreator beanNameAutoProxyCreator(){
		BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
		// 给所有以serviceImpl结尾的类创建代理对象(支持正则)  备注：aliases也是被支持的
		// 注意此处若只写`*Service` 是匹配不上helloServiceImpl
		beanNameAutoProxyCreator.setBeanNames("*ServiceImpl");

		// 备注：它要想使用拦截，只能通过setInterceptorNames,从容器内拿Advice的实现类（自己书写）
		beanNameAutoProxyCreator.setInterceptorNames("myMethodInteceptor");
		return beanNameAutoProxyCreator;

	}

	/**
	 * DefaultAdvisorAutoProxyCreator
	 * 一般都需要自己像容器注入自己的Advisor，比如NameMatchMethodPointcutAdvisor，否则它也不知道去代理谁嘛。只有被对应的Advisor匹配上的才会生成代理对象
	 */
//	@Bean
	public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
		return new DefaultAdvisorAutoProxyCreator();
	}
//	@Bean
	public NameMatchMethodPointcutAdvisor nameMatchMethodPointcutAdvisor() {
		NameMatchMethodPointcutAdvisor nameMatchMethodPointcutAdvisor = new NameMatchMethodPointcutAdvisor();

		//拦截到了HelloService#hello()方法，因此会给他创建代理对象
		nameMatchMethodPointcutAdvisor.addMethodName("*hello");

		// 请注意：此处虽然HelloController有个方法名叫helloGet，但是不会创建代理得。因为这在根容器里，这种情况不作用与子容器的Bean的
		nameMatchMethodPointcutAdvisor.addMethodName("helloGet");

//		nameMatchMethodPointcutAdvisor.setAdvice("");
		return nameMatchMethodPointcutAdvisor;
	}



}
